package lab6.systemCustom;

import java.util.Observable;
import java.util.StringTokenizer;

public class RegisterStudentHandler extends CommandEventHandler {

	/**
	 * Identificator student.
	 */
	private String sSID;

	/**
	 * Identificator curs.
	 */
	private String sCID;

	/**
	 * Construirea handler-lui pentru evenimentul "Inscriere student la un curs"
	 * si "raspunsul la verificarea confictelor intre cursuri".
	 * 
	 * @param objDataBase
	 *            referinta la obiectul baza de date
	 * @param iCommandEvCode
	 *            codul evenimentului pentru receptionarea comenzilor de
	 *            procesat
	 * @param iOutputEvCode
	 *            codul evenimentului de iesire, pentru transmiterea
	 *            rezultatului procesarii comenzii
	 */
	public RegisterStudentHandler(DataBase objDataBase, int iCommandEvCode, int iCommandEvCode2, int iOutputEvCode) {
		super(objDataBase, iCommandEvCode, iOutputEvCode);
		EventBus.subscribeTo(iCommandEvCode2, this);
	}

	/**
	 * Procesarea evenimentului asociat comenzii "Inscriere student la un curs".
	 * 
	 * @param param
	 *            sir de caractere - comanda
	 * @return sir de caractere - rezultat procesare comanda
	 */
	protected String execute(String param) {
		// Parsarea parametrilor.
		StringTokenizer objTokenizer = new StringTokenizer(param);

		sSID = objTokenizer.nextToken();
		sCID = objTokenizer.nextToken();

		// Preluarea inregistrarilor despre student si curs.
		Student objStudent = this.objDataBase.getStudentRecord(sSID);
		Course objCourse = this.objDataBase.getCourseRecord(sCID);
		if (objStudent == null) {
			// In cazul esecului se anunta esecul pentru ca studentul sa
			// primeasca banii inapoi
			EventBus.announce(EventBus.EV_STUDENT_REGISTRATION_FAIL, TaxStudent.REGISTRATION_FAILED);
			return "ID student inexisent";
		}
		if (objCourse == null) {
			// In cazul esecului se anunta esecul pentru ca studentul sa
			// primeasca banii inapoi
			EventBus.announce(EventBus.EV_STUDENT_REGISTRATION_FAIL, TaxStudent.REGISTRATION_FAILED);
			return "ID curs inexistent";
		}

		// Se cere verificarea confictelor dintre cursuri.
		EventBus.announce(EventBus.EV_CHECK_COURSE_CONFLICT, sSID + " " + sCID);

		return "";
	}

	/**
	 * Event handler of this course over demand check component. On receiving a
	 * register student event, the checking is done.
	 * 
	 * @param event
	 *            an event object. (caution: not to be directly referenced)
	 * @param param
	 *            a parameter object of the event. (to be cast to appropriate
	 *            data type)
	 */
	public void update(Observable event, Object param) {
		char c = ((String) param).charAt(0);
		if (c == '1') {
			// Procesarea evenimentului asociat comenzii
			// "Inscriere student la un curs".
			super.update(event, ((String) param).substring(2));
		} else {
			// Verificarea raspunsului dat de componenta de verificare a
			// conflictelor dintre cursuri.
			if (((String) param).compareTo("ok") == 0) {
				Student objStudent = this.objDataBase.getStudentRecord(sSID);
				if (objStudent.iBalance < 0) {
					EventBus.announce(this.iOutputEvCode, "Studentul nu are destui bani.");
					// Se anunta esecul a.i. studentul sa primeasca banii inapoi
					EventBus.announce(EventBus.EV_STUDENT_REGISTRATION_FAIL, TaxStudent.REGISTRATION_FAILED);
				} else {
					// Cerere validata. Inscriere student la curs.
					this.objDataBase.makeARegistration(sSID, sCID);
					EventBus.announce(this.iOutputEvCode, "Succes inscriere.");
				}
			} else {
				EventBus.announce(this.iOutputEvCode, (String) param);
				// Se anunta esecul a.i. studentul sa primeasca banii inapoi
				EventBus.announce(EventBus.EV_STUDENT_REGISTRATION_FAIL, TaxStudent.REGISTRATION_FAILED);
			}
		}
	}

}